package br.com.jpobluetooth.client;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class ClientActivity extends Activity {
    private EditText mensagem;
    private Button enviar;
    private Button btnAtualizar;
    private BluetoothSocket socket;
    private InputStream input;
    private OutputStream output;
    private String ultimaMensagem;
    private ArrayList<String> historicoSMS;

    private final Handler h = new Handler() {
        @Override
        public void handleMessage(Message msg) { // Manipular Mensagem
            String content = (String) msg.obj; // Captura do Conteúdo da
                                               // Mensagem
            Toast.makeText(ClientActivity.this, content, Toast.LENGTH_SHORT)
                    .show();
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.logsms);
        // Cliente de Conexão Bluetooth
        // Caixa de Texto
        historicoSMS = new ArrayList<String>();

        mensagem = (EditText) findViewById(R.id.mensagem);

        btnAtualizar = (Button) findViewById(R.id.btnatualizar);
        btnAtualizar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Thread sender = new Thread() {
                    @Override
                    public void run() { // Conteúdo para Envio
                        atualizaHistorico();
                    }
                }; // Executando o Fluxo de Processamento
                sender.start(); // Inicialização } });

            }
        });

        /*
         * // Botão de Envio enviar = (Button) findViewById(R.id.enviar);
         * enviar.setOnClickListener(new View.OnClickListener() {
         * 
         * @Override public void onClick(View v) { final String conteudo =
         * mensagem.getText().toString(); // Captura do Texto // Transferidor de
         * Dados Thread sender = new Thread() {
         * 
         * @Override public void run() { // Conteúdo para Envio
         * enviarMensagem(conteudo); } }; // Executando o Fluxo de Processamento
         * sender.start(); // Inicialização } });
         */

        // Requisição do Adaptador
        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
        if (adapter == null) { // Não há Bluetooth
            // Mensagem de Erro ao Usuário
            alert("Adaptador não Encontrado");
            finish();
        }
        if (!adapter.isEnabled()) { // Bluetooth Habilitado?
            // Mensagem de Erro ao Usuário
            alert("Bluetooth Desabilitado");
            finish();
        }
        // Dispositivos Pareados
        Set<BluetoothDevice> devices = adapter.getBondedDevices();
        // Servidor Bluetooth
        BluetoothDevice server = null;
        String servername = "ubuntu-0"; // Nome do Servidor
        // Pesquisa do Servidor Pareado
        for (BluetoothDevice device : devices) { // Laço de Busca
            if (servername.equals(device.getName())) { // Nomes Idênticos?
                server = device; // Dispositivo Encontrado e Selecionado
            }
        }
        // Dispositivo Encontrado?
        if (server == null) {
            // Mensagem de Erro ao Usuário
            alert("Servidor não Pareado");
            finish();
        }
        // Servidor Bluetooth
        final BluetoothDevice computer = server;
        // Abrindo a Conexão
        Thread connector = new Thread() {
            @Override
            public void run() {
                // Identificador Único do Servidor
                UUID ident = UUID
                        .fromString("879c3537-ae66-4013-a677-9b7e5339d13c");
                try {
                    // Socket de Conexão
                    BluetoothSocket s =
                    // Conexão a Partir do Identificador Único
                    computer.createRfcommSocketToServiceRecord(ident);
                    // Conectar ao Servidor
                    s.connect(); // Execução Bloqueante
                    // Fluxos de Entrada e Saída de Dados
                    InputStream in = s.getInputStream();
                    OutputStream out = s.getOutputStream();
                    // Captura de Objetos
                    socket = s; // Socket de Conexão
                    input = in; // Fluxo de Entrada de Dados
                    output = out; // Fluxo de Saída de Dados

                    // Informar sobre Conexão
                    alert("Conexão Aberta");
                    lerMensagens();// ativa a thread para leitura de mensagens
                } catch (IOException e) { // Erro de Entrada e Saída de Dados
                    // Mensagem de Erro ao Usuário
                    alert("Erro de Conexão");
                    finish();
                }
            }
        };
        // Executando o Fluxo de Processamento
        connector.start(); // Inicialização
    }

    @Override
    public void onDestroy() {
        super.onDestroy(); // Método Sobrescrito
        if (socket != null) { // Socket Configurado?
            try {
                socket.close(); // Fecha Conexão
            } catch (IOException e) { // Erro Encontrado?
                // Mensagem de Erro ao Usuário
                alert("Erro ao Fechar Socket");
                finish();
            }
        }
    }

    public void alert(String message) {
        Message m = h.obtainMessage();
        m.obj = message;
        h.sendMessage(m);
    }

    // thread para ler mensagem
    public void lerMensagens() {
        alert("Esperando sms!");
        Thread messageRead = new Thread() {
            @Override
            public void run() {
                try {
                    /*
                     * BufferedReader reader = new BufferedReader(new
                     * InputStreamReader( new
                     * BufferedInputStream(socket.getInputStream())));
                     */
                    byte[] buffer = new byte[1024];
                    int bytes;
                    Log.v("JPO", "Esperando mensagens...");

                    while (true) {
                        // Read from the InputStream
                        Log.d("JPO", "Tentando ler mensagem recebida");

                        bytes = input.read(buffer);
                        String msg = new String(buffer);
                        if ((!msg.trim().equals(""))
                                && (!msg.equals(ultimaMensagem))) {
                            ultimaMensagem = msg.trim();
                            Log.d("JPO", "input stream :" + ultimaMensagem);
                            alert("Texto Recebido: " + ultimaMensagem);
                            tratarSMSRecebida(ultimaMensagem);
                        }
                    }

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    finish();
                } // TODO
            }
        };
        messageRead.run(); // executando thread
    }

    public void tratarSMSRecebida(String mensagem) {
        historicoSMS.add(mensagem);
        Log.d("JPO", "Texto recebido para ser add: " + mensagem);

    }

    public void enviarMensagem(String conteudo) {

        byte content[] = conteudo.getBytes();
        try { // Possibilidade de Erro
            output.write(content.length); // Tamanho do Conteúdo
            output.write(content); // Conteúdo Propriamente Dito
            // Aviso de Sucesso ao Usuário
            alert("Texto Enviado");
        } catch (IOException e) { // Erro Encontrado
            // Aviso de Erro ao Usuário
            alert("Erro na Transferência");
            finish();
        }
    }

    public void atualizaHistorico() {
        setContentView(R.layout.logsms);
        ListView listView = (ListView) findViewById(R.id.lista1);

        List<String> logStringList = new ArrayList<String>();
        for (String logSMS : historicoSMS) {
            logStringList.add(logSMS);
        }
        String[] values = logStringList
                .toArray(new String[logStringList.size()]);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                R.layout.my_simple_list, android.R.id.text1, values);

        // Assign adapter to ListView
        listView.setAdapter(adapter);
    }

}
